package uy.org.softtech.cssuite.web.controladores;

import static org.springframework.util.Assert.notNull;

import java.util.Set;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.context.annotation.Configuration;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import uy.org.softtech.cssuite.core.Controlador;
import uy.org.softtech.cssuite.entidad.finanzas.Pago;
import uy.org.softtech.cssuite.servicios.ServiciosFinancieros;

/**
 * Controlador encargado de responder a los pedidos via AJAX relacionados a los pagos de una cuenta de cliente en la aplicación.
 * 
 * @author fabian.lobo
 */
@Configuration
@Controller("controlador-ajax-pagos")
@ManagedResource(
	objectName = "cssuite:type=Controlador,name=ControladorAjaxPagos", 
	description = "Controlador encargado de responder a los pedidos via AJAX relacionados a los pagos de una cuenta de cliente en la aplicación.",
	log = true, logFile = "jmx.log", currencyTimeLimit = 15,
	persistPolicy = "OnUpdate", persistPeriod = 200
)
@RequestMapping(method = RequestMethod.GET, value = "pagos.json", produces = {"application/json; charset=UTF-8"})
public class ControladorAjaxPagos extends Controlador {
	
	private Logger log = Logger.getLogger(getClass());
	
	// Servicios
	@Resource(name = "servicios-financieros")
	private ServiciosFinancieros serviciosFinancieros;
	
	/**
	 * Método para verificar que todos los parámetros han sido seteados correctamente.
	 * 
	 * @author fabian.lobo
	 */
	@PostConstruct
	public void inicializacion(){
		super.inicializacion();
		
		notNull(serviciosFinancieros(), "La propiedad [serviciosFinancieros] de [" + getClass().getName() + "] no ha sido establecida.");
		
		log.info("Controlador encargado de responder a los pedidos via AJAX relacionados a los pagos de una cuenta de cliente en la aplicación ha sido inicializado.");
	}
	
	/**
	 * Retorna una lista de los pagos pertenecientes a la cuenta relacionada con el identificador dado
	 * 
	 * @param id - Identificador de la cuenta de cliente
	 * @author fabian.lobo
	 */
	@RequestMapping(params = {"accion=LISTAR", "id"})
	@ResponseBody
	@Secured(value = {"ROLE_VER_CUENTAS"})
	public Set<Pago> pagos(@RequestParam(value = "id")Long id) {
		return serviciosFinancieros().obtenerPagos(id);
	}

	
	public ServiciosFinancieros serviciosFinancieros() {
		return serviciosFinancieros;
	}

}
